home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / dev / amos / 3DAmosDemo.lha / 3DSpaceships.amos / 3DSpaceships.amosSourceCode next >
AMOS Source Code  |  1992-11-09  |  6KB  |  232 lines

  1. '
  2. ' 3D graphics demo 
  3. ' by Richard Ling. 
  4. '
  5. PSIZE=8000 : DPH=200 : OBJNUM=8 : SHOTNUM=3 : BLTNUM=35
  6. Dim OBJ(OBJNUM-1,13),SHOT(SHOTNUM-1,11),SPT(BLTNUM,1),SEQ(15)
  7. Global DPH,PSIZE,OBJNUM,SHOTNUM,BLTNUM,NXTSHOT,SHOTDEL,GELS,LANDED
  8. Global OBJ(),SHOT(),SPT(),SEQ()
  9. Hide On : Degree 
  10. X Mouse=288 : Y Mouse=100
  11. INITSCREENS
  12. INITVARS
  13. '
  14. Do 
  15.    Dec SHOTDEL
  16.    If Mouse Key and SHOTDEL<=0 Then INITSHOT[NXTSHOT]
  17.    For T=0 To SHOTNUM-1
  18.       If SHOT(T,0)=True
  19.          SDIS=SHOT(T,3)
  20.          For TH=0 To OBJNUM-1
  21.             If OBJ(TH,3)=SDIS and OBJ(TH,0)
  22.                Plot SHOT(T,6),SHOT(T,8),0 : O=OBJ(TH,8)
  23.                Paste Bob(OBJ(TH,5))/100-SPT(O,0),OBJ(TH,7)-SPT(O,1),O
  24.                If Point(SHOT(T,6),SHOT(T,8))>0
  25.                   SHOT(T,0)=False : Boom : OBJ(TH,0)=1
  26.                End If 
  27.             End If 
  28.          Next TH
  29.          UDATESHOT[T]
  30.       End If 
  31.    Next T
  32.    Copy BGA,BGB To SOURCEA
  33.    Copy BGB,BGC To SOURCEB
  34.    Copy BGC,BGD To SOURCEC
  35.    Copy BGD,BGE To SOURCED
  36.    For T=0 To OBJNUM-1
  37.       UDATEOBJ[T]
  38.    Next T
  39.    SEQUENCE
  40.    Screen 0 : Ink 3
  41.    For T=GELS-1 To 0 Step -1
  42.       GEL=SEQ(T) and $FF
  43.       If GEL>49
  44.          GEL=GEL-50
  45.          DRWOBJ[GEL,5]
  46.       Else 
  47.          If SHOT(GEL,0)
  48.             Draw SHOT(GEL,6),SHOT(GEL,8) To SHOT(GEL,9),SHOT(GEL,11)
  49.          End If 
  50.       End If 
  51.    Next T
  52.    Screen 1 : Ink 3
  53.    For T=GELS-1 To 0 Step -1
  54.       GEL=SEQ(T) and $FF
  55.       If GEL>49
  56.          GEL=GEL-50
  57.          DRWOBJ[GEL,6]
  58.       Else 
  59.          If SHOT(GEL,0)
  60.             Draw SHOT(GEL,7),SHOT(GEL,8) To SHOT(GEL,10),SHOT(GEL,11)
  61.          End If 
  62.       End If 
  63.    Next T
  64.    Wait Vbl 
  65.    Copy SOURCEA,SOURCEA+PSIZE To DESTA
  66.    Copy SOURCEB,SOURCEB+PSIZE To DESTB
  67.    Copy SOURCEC,SOURCEC+PSIZE To DESTC
  68.    Copy SOURCED,SOURCED+PSIZE To DESTD
  69. Loop 
  70. '
  71. Procedure UDATEOBJ[N]
  72.    PC=OBJ(N,9)
  73.    Gosub PC+0
  74.    OBJ(N,9)=PC
  75.    Pop Proc
  76.    '
  77.    'MOUNTAIN
  78.    '========
  79.    0 X=OBJ(N,1) : Z=OBJ(N,3)
  80.    OBJ(N,5)=((DPH*(X-30))/(DPH+Z)+185)*100
  81.    OBJ(N,6)=((DPH*(X+30))/(DPH+Z)+135)*100
  82.    OBJ(N,7)=(DPH*100)/(DPH+Z)+140 : PC=1
  83.    OBJ(N,0)=True
  84.    'main: 
  85.    1 Return 
  86.    '
  87.    'FLYING SAUCER 
  88.    '============= 
  89.    100 X=OBJ(N,1) : Z=OBJ(N,3) : Y=40-Rnd(20) : Gosub INIT3D
  90.    VELOC=Rnd(1000)+100 : OBJ(N,11)=(VELOC*DPH)/(DPH+Z)
  91.    If Rnd(1) Then OBJ(N,11)=-OBJ(N,11)
  92.    OBJ(N,0)=True : PC=101
  93.    'main: 
  94.    101 Add OBJ(N,5),OBJ(N,11),-5000 To 37000
  95.    OBJ(N,6)=OBJ(N,5)+OBJ(N,4)
  96.    If OBJ(N,0)<1 Then Return 
  97.    OBJ(N,0)=True : Add OBJ(N,8),8 : PC=102 : Return 
  98.    102 Add OBJ(N,8),4 : PC=103 : Return 
  99.    103 Add OBJ(N,8),-12 : Goto 100
  100.    '
  101.    'LANDING SAUCER  
  102.    '==============
  103.    200 Y=-300 : Z=OBJ(N,3) : X=20-Rnd(40) : Gosub INIT3D
  104.    OBJ(N,6)=OBJ(N,5)+OBJ(N,4) : OBJ(N,11)=202 : PC=201
  105.    OBJ(N,0)=True
  106.    'main: 
  107.    201 If OBJ(N,0)=1 Then Goto 210
  108.    Goto OBJ(N,11)
  109.    202 Add OBJ(N,7),2 : If OBJ(N,7)>180 Then OBJ(N,11)=203 : LANDED=True
  110.    Return 
  111.    203 If Rnd(25)=0 Then OBJ(N,11)=204 : LANDED=False
  112.    Return 
  113.    204 Add OBJ(N,7),-2 : If OBJ(N,7)<-50 Then PC=205
  114.    Return 
  115.    205 If Rnd(100)=0 Then PC=200
  116.    Return 
  117.    210 OBJ(N,0)=True : OBJ(N,8)=12 : PC=211 : Return 
  118.    211 OBJ(N,8)=16 : PC=212 : Return 
  119.    212 OBJ(N,8)=4 : OBJ(N,0)=0 : PC=205 : Return 
  120.    '
  121.    'ALIEN 
  122.    '===== 
  123.    300 If Not LANDED Then Return 
  124.    OBJ(N,7)=(DPH*100)/(DPH+175)+140 : OBJ(N,5)=OBJ(6,5)
  125.    OBJ(N,4)=(DPH*6000)/(DPH+175)-5000
  126.    OBJ(N,0)=True : PC=302 : LANDED=False
  127.    If Rnd(1) Then OBJ(N,11)=-1 Else OBJ(N,11)=1
  128.    302 Add OBJ(N,5),OBJ(N,11)*-100
  129.    If Abs(OBJ(N,5)-16000)>15000 Then OBJ(N,0)=0 : PC=300 : Return 
  130.    OBJ(N,6)=OBJ(N,5)+OBJ(N,4)
  131.    Add OBJ(N,8),OBJ(N,11),24 To 27
  132.    If OBJ(N,0)<1 Then Return 
  133.    OBJ(N,8)=27 : PC=303
  134.    303 Inc OBJ(N,8) : If OBJ(N,8)>35 Then PC=300 : OBJ(N,0)=0 : Goto 300
  135.    Return 
  136.    '
  137.    INIT3D:
  138.    OBJ(N,5)=((DPH*(X-30))/(DPH+Z)+185)*100
  139.    OBJ(N,7)=(DPH*Y)/(DPH+Z)+140
  140.    OBJ(N,4)=(DPH*6000)/(DPH+Z)-5000
  141.    Return 
  142. End Proc
  143. Procedure DRWOBJ[N,A]
  144.    O=OBJ(N,8)
  145.    Paste Bob OBJ(N,A)/100-SPT(O,0),OBJ(N,7)-SPT(O,1),O
  146. End Proc
  147. Procedure INITSHOT[N]
  148.    Add NXTSHOT,1,0 To 2 : SHOTDEL=8
  149.    X=0 : Y=75 : Z=0 : SHOT(N,0)=True : Shoot 
  150.    SHOT(N,1)=X : SHOT(N,2)=Y : SHOT(N,3)=Z
  151.    SHOT(N,4)=(X Screen(X Mouse)-160)/5
  152.    SHOT(N,5)=(-Y Screen(Y Mouse)+10)/5
  153.    SHOT(N,6)=(DPH*(X-30))/(DPH+Z)+185
  154.    SHOT(N,7)=(DPH*(X+30))/(DPH+Z)+135
  155.    SHOT(N,8)=(DPH*Y)/(DPH+Z)+140
  156. End Proc
  157. Procedure UDATESHOT[N]
  158.    For T=6 To 8 : SHOT(N,T+3)=SHOT(N,T) : Next T
  159.    Add SHOT(N,1),SHOT(N,4) : Add SHOT(N,2),SHOT(N,5)
  160.    Add SHOT(N,3),25
  161.    X=SHOT(N,1) : Y=SHOT(N,2) : Z=SHOT(N,3)
  162.    SHOT(N,6)=(DPH*(X-30))/(DPH+Z)+185
  163.    SHOT(N,7)=(DPH*(X+30))/(DPH+Z)+135
  164.    SHOT(N,8)=(DPH*Y)/(DPH+Z)+140
  165.    If Z>1550 Then SHOT(N,0)=False
  166.    If Y>100 Then SHOT(N,0)=False : Boom 
  167. End Proc
  168. Procedure INITVARS
  169.    For N=0 To OBJNUM-1
  170.       Read OBJ(N,10)
  171.       OBJ(N,9)=OBJ(N,10)*100
  172.       For T=1 To 3
  173.          Read OBJ(N,T)
  174.       Next T
  175.       Read OBJ(N,8)
  176.    Next N
  177.    For T=1 To BLTNUM
  178.       PTR=Sprite Base(T)
  179.       SPT(T,0)=Deek(PTR+6) : SPT(T,1)=Deek(PTR+8)
  180.    Next T
  181.    Data 0,80,100,550,1
  182.    Data 0,-200,100,250,2
  183.    Data 0,220,100,200,3
  184.    Data 1,-525,0,350,5
  185.    Data 1,-625,0,450,6
  186.    Data 1,-825,0,700,7
  187.    Data 2,0,0,150,4
  188.    Data 3,0,0,175,24
  189. End Proc
  190. Procedure INITSCREENS
  191.    Shared BGA,BGB,BGC,BGD,BGE
  192.    Shared SOURCEA,SOURCEB,SOURCEC,SOURCED
  193.    Shared DESTA,DESTB,DESTC,DESTD
  194.    BGA=Start(7) : BGB=BGA+8000 : BGC=BGB+8000
  195.    BGD=BGC+8000 : BGE=BGD+8000
  196.    Screen Open 0,320,200,4,Lowres : Flash Off : Colour 3,$F0 : RemScreen Hide 
  197.    SOURCEA=Phybase(0) : SOURCEB=Phybase(1)
  198.    Screen Open 1,320,200,4,Lowres : Flash Off : Colour 3,$F0 : RemScreen Hide 
  199.    SOURCEC=Phybase(0) : SOURCED=Phybase(1)
  200.    Screen Open 2,320,200,16,Lowres : Flash Off 
  201.    DESTA=Phybase(0) : DESTB=Phybase(1)
  202.    DESTC=Phybase(2) : DESTD=Phybase(3)
  203.    Palette 0,$400,$5,$405
  204.    For T=0 To 15 : Read X : Colour T,X : Colour T+16,X : Next T
  205.    Data $300+$30,$300+$40,$300+$50,$300+$60
  206.    Data $400+$30,$400+$40,$400+$50,$400+$60
  207.    Data $500+$30,$500+$40,$500+$50,$500+$60
  208.    Data $600+$30,$600+$40,$600+$50,$600+$60
  209. End Proc
  210. Procedure SEQUENCE
  211.    GELS=0
  212.    For T=0 To OBJNUM-1
  213.       If OBJ(T,0)
  214.          SEQ(GELS)=OBJ(T,3)
  215.          Rol.l 8,SEQ(GELS)
  216.          Add SEQ(GELS),T+50
  217.          Inc GELS
  218.       End If 
  219.    Next T
  220.    For T=0 To SHOTNUM-1
  221.       If SHOT(T,0)
  222.          SEQ(GELS)=SHOT(T,3)
  223.          Rol.l 8,SEQ(GELS)
  224.          Add SEQ(GELS),T
  225.          Inc GELS
  226.       End If 
  227.    Next T
  228.    For T=GELS To 15
  229.       SEQ(T)=$7FFFFFFF
  230.    Next T
  231.    Sort SEQ(0)
  232. End Proc